package untils

import (
	"fmt"
)

type FamilyAccount struct{
	//声明必要的字段.
	//声明变量接受用户选项
	key string
	//声明一个变量判断是否退出
	loop bool
	//定义账户余额
	balance float64
	//每次收支的金额
	money float64
	//每次收支的说明
	note string
	//收支的详情使用字符串存储
	//当有收支时，只需要对details进行拼接处理
	details string
	//:= "收支\t账户金额\t收支金额\t说    明"
	//判断用户是否退出
	check string
	//定义一个变量，存储是否有收支记录
	flag bool
}

//编写要给工厂模式的构造方法，返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount {
	return &FamilyAccount{
		key : "",
		loop : true,
		balance : 10000.0,
		money : 0.0,
		note : "",
		flag : false,
		details : "收支\t账户金额\t收支金额\t说    明",
	}

}

//给结构体绑定方法
//显示主菜单
func (this *FamilyAccount) MainMenu() {
	//显示主菜单
	for {
		fmt.Println("\n-----------------家庭收支记账软件-----------------")
		fmt.Println("                  1 收支明细")
		fmt.Println("                  2 登记收入")
		fmt.Println("                  3 登记支出")
		fmt.Println("                  4 退出软件")
		fmt.Print("请选择(1-4)：")
		fmt.Scanln(&this.key)
		switch this.key{
		case "1":
			this.showDetails()
		case "2":
			this.updateAccount(2)
			this.flag = true
		case "3":
			r := this.updateAccount(3)
			if !r {
				break
			}
			this.flag = true
		case "4":
			this.logout()
		default:
			fmt.Println("请输入正确选项..")
		}
		if !this.loop {
			break
		}
	}
	fmt.Println("您已退出家庭记账软件。")
}
//打印记录
func (this *FamilyAccount) showDetails(){
	fmt.Println("-----------------当前收支明细记录-----------------")
	if this.flag {
		fmt.Println(this.details)
	}else{
		fmt.Println("当前没有收支明细... 来一笔吧!")
	}
}

//退出
func (this *FamilyAccount) logout() {
	fmt.Println("是否退出？(Y/N):")
	for {
		fmt.Scanln(&this.check)
		if this.check == "y" || this.check == "n" {
			break
		}
		fmt.Println("您的输入有误，请重新输入 y/n")
	}
	if this.check == "y" {
		this.loop = false
	}
}

//登记 收入/支出
func (this *FamilyAccount) updateAccount(way int) bool{
	t := ""
	flag := true
	if way == 3{
		t = "支出"
		this.balance -= this.money // 修改账户余额
	}else{
		t = "收入"
		this.balance += this.money // 修改账户余额
	}
	fmt.Println("本次"+t+"金额:")
	fmt.Scanln(&this.money)
	if way == 3 {
		if this.money > this.balance {
			fmt.Println("余额不足")
			return false
		}
	}
	fmt.Println("本次"+t+"说明:")
	fmt.Scanln(&this.note)
	//将这个收入情况，拼接到details变量
	//收入    11000           1000            有人发红包
	this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v", this.balance, this.money, this.note)
	return flag
}

